"""
程序调用自身叫做递归  递归就是在函数内部调用自己的函数被称之为递归。
1、必须有一个明确的结束条件
2、每次进入更深一层递归时，问题规模(计算量)相比上次递归都应有所减少
3、递归效率不高，递归层次过多会导致栈溢出（在计算机中，函数调用是通过栈（stack）这种数据结构实现的，每当进入一个函数调用，栈就会加一层栈帧，每当函数返回，栈就会减一层栈帧。由于栈的大小不是无限的，所以，递归调用的次数过多，会导致栈溢出）

1！+2！+3！+4！+5！+...+n! 递归 阶乘
"""


def factorial(n):
    if n == 1:  # 递归头
        return n
    return n * factorial(n - 1)


x = factorial(100)
print(x)

"""
递归推斐波那契数列
# 1，1，2，3，5，8，13，21，34，55，试判断数列第十五个数是哪个？
"""


def fbl(n):
    if n <= 2:
        v = 1
        return v
    v = fbl(n - 1) + fbl(n - 2) # 17
    return v


x = fbl(10)
print(x)
